package echecs;

import echecs.Pieces.Piece;
import java.util.ArrayList;
import java.util.List;
import static echecs.Pieces.Piece.*;

public class Algorithme extends Etat {

    private List<Coups> pListeCoups;

    public Algorithme(Couleur pCouleur, Piece[] pPieces) {
        pListeCoups = new ArrayList<Coups>();
        pListeCoups = parcourir_echiquier(pCouleur, pPieces);

    }

    private List<Coups> parcourir_echiquier(Couleur pCouleur, Piece[] pPieces) {
        PIECES = pPieces;
        _couleur = pCouleur;

        while (NouvelleCase.eval()) {
            LirePieceCaseDepart.exec();
            if (PieceCouleurQuiJoue.eval()) {
                pListeCoups.addAll(appliquerRegles());
            }
            CaseSuivante.exec();
        }

        return pListeCoups;
    }

    private List<Coups> appliquerRegles() {
        List<Coups> liste = new ArrayList<Coups>();
        InitialiseDistance.exec();
        InitialiseDirection.exec();
        if (PieceFouTourOuDame.eval()) {
            while (AutreDirectionExiste.eval()) {
                while (CaseArriveeVide.eval()) {
                    memoriser(liste);
                    DistanceSuivante.exec();
                }
                if (CaseArriveeOccupee.eval() && PiecesCouleursOpposees.eval()) {
                    memoriser(liste);
                }
                InitialiseDistance.exec();
                DirectionSuivante.exec();
            }
        } else if (EstUnPion.eval()) {
            coupsDuPion(liste);
        } else {
            InitialiseDistance.exec();
            while (AutreDirectionExiste.eval()) {
                if (CaseArriveeVide.eval() || CaseArriveeOccupee.eval() && PiecesCouleursOpposees.eval()) {
                    memoriser(liste);
                }
                DirectionSuivante.exec();
            }
        }
        InitialiseDirection.exec();

        return liste;
    }

    private void coupsDuPion(List<Coups> liste) {
        //private void traiterEnPassant
        //private void traiterPromotion
        InitialiseDistance.exec();
        InitialiseDirection.exec();
        if (CaseArriveeVide.eval()) {
            memoriser(liste);
            if (EstUnPionAuDepart.eval()) {
                DistanceSuivante.exec();
                if (CaseArriveeVide.eval()) {
                    memoriser(liste);
                }
            }
        }
        for (pIndexDirection = 1; pIndexDirection <= 2; pIndexDirection++) {
            if (CaseArriveeOccupee.eval()) {
                if (PiecesCouleursOpposees.eval()) {
                    memoriser(liste);
                }
            }
        }
    }

    private void memoriser(List<Coups> listeCoupsPiece) {
        pIndexArrivee = indexArrivee();
        listeCoupsPiece.add(new Coups(pIndexDepart, pPieceDepart, pIndexArrivee));
    }

    public List<Coups> getPListeCoups() {
        return pListeCoups;
    }
}









